/*
 * To change SessionMBean template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.core.view.mbean;

import com.brain.cont.dto.PlanContableDetaDto;
import com.brain.cont.manager.PlanContableDetaManager;
import com.brain.cont.view.util.ConstantesCont;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.BitacoraDto;
import com.brain.core.dto.EmpresaDto;
import com.brain.core.dto.OrganizacionDto;
import com.brain.core.dto.ParametroDto;
import com.brain.core.exception.DAOException;
import com.brain.core.manager.OrganizacionManager;
import com.brain.core.manager.RecursosManager;
import com.brain.segu.dto.OpcionSistemaDto;
import com.brain.segu.dto.PermisoRolDto;
import com.brain.segu.dto.UsuarioDto;
import com.brain.segu.manager.MenuBarHelper;
import com.brain.segu.manager.PermisoRolManager;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import org.apache.log4j.Logger;
import org.primefaces.component.menubar.Menubar;
import org.primefaces.model.MenuModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Indra
 */
@Controller("sessionMBean")
@Scope("session")
public class SessionMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(SessionMBean.class);
    private String titulo;
    private int accion;
    private int accionDetalle;
    private String tema = "casablanca";
    private String idioma = "es";
    private int cantidadRegistros = 10;
    private Boolean exportarExcel = Boolean.TRUE;
    private Boolean exportarCvs = Boolean.TRUE;
    private Boolean exportarPdf = Boolean.TRUE;
    private String sessionTerminal;
    private String usuarioConectado = "Ronald R. Chang O.";
    private MenuModel menuModel;
    private UsuarioDto sessionUsuarioDto;
    private final Long rolSystem = 0L;
    //private Long sessionOrganizacion;
    private String mensajeExpiraSession = "";
    private Menubar principalMenuBar;
    private Long entidad;
    private Long registro;
//    private Long empresa;
    private EmpresaDto empresaDto;
    @Autowired
    private PermisoRolManager permisoRolManager;
    @Resource
    private RecursosManager recursosManager;
    private Map<String, Boolean> privilegiosOpciones = new HashMap<String, Boolean>();
    private List<BitacoraDto> listaBitacoras;
    private List<OrganizacionDto> listaOrganizacionesUsuario;
    private OrganizacionDto organizacionDto;
    private List<EmpresaDto> listaEmpresas;
    private ParametroDto anoContableDto;
    private ParametroDto mesContableDto;
    private List<ParametroDto> siAnos;
    private List<ParametroDto> siMeses;
    private List<PlanContableDetaDto> listaCuentas;
    
    @Resource
    PlanContableDetaManager planContableDetaManager;

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        SessionMBean.logger = logger;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public int getAccion() {
        return accion;
    }

    public void setAccion(int accion) {
        this.accion = accion;
    }

    public int getAccionDetalle() {
        return accionDetalle;
    }

    public void setAccionDetalle(int accionDetalle) {
        this.accionDetalle = accionDetalle;
    }

    public String getTema() {
        return tema;
    }

    public void setTema(String tema) {
        this.tema = tema;
    }

    public String getIdioma() {
        return idioma;
    }

    public void setIdioma(String idioma) {
        this.idioma = idioma;
    }

    public int getCantidadRegistros() {
        return cantidadRegistros;
    }

    public void setCantidadRegistros(int cantidadRegistros) {
        this.cantidadRegistros = cantidadRegistros;
    }

    public Boolean getExportarExcel() {
        return exportarExcel;
    }

    public void setExportarExcel(Boolean exportarExcel) {
        this.exportarExcel = exportarExcel;
    }

    public Boolean getExportarCvs() {
        return exportarCvs;
    }

    public void setExportarCvs(Boolean exportarCvs) {
        this.exportarCvs = exportarCvs;
    }

    public Boolean getExportarPdf() {
        return exportarPdf;
    }

    public void setExportarPdf(Boolean exportarPdf) {
        this.exportarPdf = exportarPdf;
    }

    public String getSessionTerminal() {
        return sessionTerminal;
    }

    public void setSessionTerminal(String sessionTerminal) {
        this.sessionTerminal = sessionTerminal;
    }

    public String getUsuarioConectado() {
        return usuarioConectado;
    }

    public void setUsuarioConectado(String usuarioConectado) {
        this.usuarioConectado = usuarioConectado;
    }

    public MenuModel getMenuModel() {
        return menuModel;
    }

    public void setMenuModel(MenuModel menuModel) {
        this.menuModel = menuModel;
    }

    public UsuarioDto getSessionUsuarioDto() {
        return sessionUsuarioDto;
    }

    public void setSessionUsuarioDto(UsuarioDto sessionUsuarioDto) {
        this.sessionUsuarioDto = sessionUsuarioDto;
    }

    public String getMensajeExpiraSession() {
        return mensajeExpiraSession;
    }

    public void setMensajeExpiraSession(String mensajeExpiraSession) {
        this.mensajeExpiraSession = mensajeExpiraSession;
    }

    public Map<String, Boolean> getPrivilegiosOpciones() {
        return privilegiosOpciones;
    }

    public void setPrivilegiosOpciones(Map<String, Boolean> privilegiosOpciones) {
        this.privilegiosOpciones = privilegiosOpciones;
    }

    public void cargarMenuBar() {
        try {
            /*Map<String, Object> map = new HashMap<String, Object>();
            map.put("rolDto.id", getSessionUsuarioDto().getRolDto().getId());
            map.put("opcionSistemaDto.activo", Boolean.TRUE);
            map.put("opcionSistemaDto.tipoMenu", "M");
            Map<String, String> order = new HashMap<String, String>();
            order.put("opcionSistemaDto.orden", "asc");
            order.put("opcionSistemaDto.descripcion", "asc");
            List<PermisoRolDto> listaPermisos = permisoRolManager.obtenerConFiltroConOrden(map, order);
            * */
            List<PermisoRolDto> listaPermisos = recursosManager.obtenerOpcionesXRol(getSessionUsuarioDto().getRolDto());
            List<OpcionSistemaDto> listaOpciones = new ArrayList<OpcionSistemaDto>();
            for (PermisoRolDto p : listaPermisos) {
                OpcionSistemaDto o = p.getOpcionSistemaDto();
                o.setPermiso(p.getEstado());
                if (o.getPermiso() && o.getTipoMenu().equals("M")) {
                    listaOpciones.add(o);
                }

            }

            //UtilCore.General.ordena(listaOpciones, "orden");
            MenuBarHelper menuBarHelper = (MenuBarHelper) WebServletContextListener.getApplicationContext().getBean("menuBarHelper");
            this.principalMenuBar = menuBarHelper.getMenuBar(listaOpciones, listaPermisos);

        } catch (Exception e) {

            String msg = UtilCore.Internacionalizacion.getMensajeInternacional("general.mensaje.error.cargar.menu");
            showError(msg, e.getMessage());
            logger.error(msg, e);
        }
    }
    
    public void cargarMenuBar(List<PermisoRolDto> listaPermisos) {
        try {
            /*Map<String, Object> map = new HashMap<String, Object>();
            map.put("rolDto.id", getSessionUsuarioDto().getRolDto().getId());
            map.put("opcionSistemaDto.activo", Boolean.TRUE);
            map.put("opcionSistemaDto.tipoMenu", "M");
            Map<String, String> order = new HashMap<String, String>();
            order.put("opcionSistemaDto.orden", "asc");
            order.put("opcionSistemaDto.descripcion", "asc");
            List<PermisoRolDto> listaPermisos = permisoRolManager.obtenerConFiltroConOrden(map, order);
            * */
            
            List<OpcionSistemaDto> listaOpciones = new ArrayList<OpcionSistemaDto>();
            for (PermisoRolDto p : listaPermisos) {
                OpcionSistemaDto o = p.getOpcionSistemaDto();
                o.setPermiso(p.getEstado());
                if (o.getPermiso() && o.getTipoMenu().equals("M")) {
                    listaOpciones.add(o);
                }

            }

            //UtilCore.General.ordena(listaOpciones, "orden");
            MenuBarHelper menuBarHelper = (MenuBarHelper) WebServletContextListener.getApplicationContext().getBean("menuBarHelper");
            this.principalMenuBar = menuBarHelper.getMenuBar(listaOpciones, listaPermisos);

        } catch (Exception e) {

            String msg = UtilCore.Internacionalizacion.getMensajeInternacional("general.mensaje.error.cargar.menu");
            showError(msg, e.getMessage());
            logger.error(msg, e);
        }
    }

    public String cambiarOrganizacionUsuario() {
        String to = "/inicio.xhtml";
        String mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("general.cambio.organizacion");
        showMessage(mensajeTrx + " " + this.organizacionDto.getNombre() + "-" + this.organizacionDto.getPaisDto().getDescripcion());
        return to;
    }

    public void cambiarEmpresa() {
        try {
            SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
            OrganizacionManager organizacionManager = (OrganizacionManager) WebServletContextListener.getApplicationContext().getBean("organizacionManager");

            sessionMBean.setListaOrganizacionesUsuario(organizacionManager.obtenerActivosPorEmpresa(sessionMBean.getEmpresaDto()));
            if (sessionMBean.getListaOrganizacionesUsuario() != null && sessionMBean.getListaOrganizacionesUsuario().get(0) != null) {
                sessionMBean.setOrganizacionDto(sessionMBean.getListaOrganizacionesUsuario().get(0));
            } else {
                sessionMBean.setOrganizacionDto(null);
            }

            irInicio();
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }

    public void cambiarAnoContable() {
        irInicio();
    }

    public void cambiarMesContable() {
        irInicio();
    }

    public void irInicio() {
        FacesContext fc = FacesContext.getCurrentInstance();
        ExternalContext extContext = FacesContext.getCurrentInstance().getExternalContext();
        String url = extContext.encodeActionURL(fc.getApplication().getViewHandler().getActionURL(fc, "/inicio.xhtml"));

        //  System.out.println(this.sessionOrganizacionDto.getDescripcion());

        try {
            extContext.redirect(url);
        } catch (IOException e1) {
            logger.error(e1);
        }
    }

    public Menubar getPrincipalMenuBar() {
        return principalMenuBar;
    }

    public void setPrincipalMenuBar(Menubar principalMenuBar) {
        this.principalMenuBar = principalMenuBar;
    }

    public PermisoRolManager getPermisoRolManager() {
        return permisoRolManager;
    }

    public void setPermisoRolManager(PermisoRolManager permisoRolManager) {
        this.permisoRolManager = permisoRolManager;
    }

    public List<BitacoraDto> getListaBitacoras() {
        return listaBitacoras;
    }

    public void setListaBitacoras(List<BitacoraDto> listaBitacoras) {
        this.listaBitacoras = listaBitacoras;
    }

    public Long getEntidad() {
        return entidad;
    }

    public void setEntidad(Long entidad) {
        this.entidad = entidad;
    }

    public Long getRegistro() {
        return registro;
    }

    public void setRegistro(Long registro) {
        this.registro = registro;
    }

    public List<OrganizacionDto> getListaOrganizacionesUsuario() {
        return listaOrganizacionesUsuario;
    }

    public void setListaOrganizacionesUsuario(List<OrganizacionDto> listaOrganizacionesUsuario) {
        this.listaOrganizacionesUsuario = listaOrganizacionesUsuario;
    }

    public OrganizacionDto getOrganizacionDto() {
        return organizacionDto;
    }

    public void setOrganizacionDto(OrganizacionDto organizacionDto) {
        this.organizacionDto = organizacionDto;
    }

    public Long getRolSystem() {
        return rolSystem;
    }

    public EmpresaDto getEmpresaDto() {
        return empresaDto;
    }

    public void setEmpresaDto(EmpresaDto empresaDto) {
        this.empresaDto = empresaDto;
    }

    public List<EmpresaDto> getListaEmpresas() {
        return listaEmpresas;
    }

    public void setListaEmpresas(List<EmpresaDto> listaEmpresas) {
        this.listaEmpresas = listaEmpresas;
    }

    public List<PlanContableDetaDto> getListaCuentas() throws DAOException {
        if (listaCuentas == null || listaCuentas.isEmpty()) {
            try {
                //Cargamos a la session las cuentas contables del plan contable de la organizacion
                listaCuentas = planContableDetaManager.obtenerCuentasContablesPorPlan(getOrganizacionDto().getPlanContableDto().getId());
            } catch (DAOException ex) {
                listaCuentas = new ArrayList<PlanContableDetaDto>();
            }
        }
        

        return listaCuentas;
    }

    public void setListaCuentas(List<PlanContableDetaDto> listaCuentas) {
        this.listaCuentas = listaCuentas;
    }

    public List<ParametroDto> getSiAnos() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistema(ConstantesCont.CatalogoParametro.CONTA_ANIOS_TRABAJO);
    }

    public void setSiAnos(List<ParametroDto> siAnos) {
        this.siAnos = siAnos;
    }

    public List<ParametroDto> getSiMeses() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistema(ConstantesCont.CatalogoParametro.CONTA_MESES_TRABAJO);
    }

    public void setSiMeses(List<ParametroDto> siMeses) {
        this.siMeses = siMeses;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public ParametroDto getAnoContableDto() {
        return anoContableDto;
    }

    public void setAnoContableDto(ParametroDto anoContableDto) {
        this.anoContableDto = anoContableDto;
    }

    public ParametroDto getMesContableDto() {
        return mesContableDto;
    }

    public void setMesContableDto(ParametroDto mesContableDto) {
        this.mesContableDto = mesContableDto;
    }
}
